

package DAO;
import Pojo.Cliente;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.logging.Level;
import java.util.logging.Logger;

/**Classe que serve para manipulacao da Lista de Clientes
 * 
 * @author Vitor
 */
public class ClienteDAO {
 
   private ArrayList<Cliente> listaCliente = new ArrayList<Cliente>();
   
   /**metodo que recebe um cliente como paramentro e o adiciona em lista
    * 
    * @param novo Cliente - Classe que contem informacoes do Cliente
    */
   public void adicionar(Cliente novo){
        listaCliente.add(novo);
        Collections.sort(listaCliente);
   }
   /**metodo que recebe um nome e remove o cliente com esse nome da lista
    * ou retorna null caso o nome nao exista
    * 
    * @param nomedel String - Nome do cliente a ser deletado
    */
    
    /**
     * metodo que recebe um nome e remove o cliente com esse nome da lista
 ou retorna null caso o nome nao exista
     * @param nomedel String - Nome do cliente a ser deletado
     * @return boolean - retorna null caso o cliente nao exista
     */
    public boolean excluirCliente(String nomedel){
        Cliente aux = new Cliente();
        aux.setNome(nomedel);
        return this.listaCliente.remove(aux);
        
   }
   /**metodo que recebe um nome e retorna o cliente com esse nome ou null caso nao exista o cliente com esse nome
    * 
    * @param nome String - Nome do cliente a ser buscado
    * @return  Cliente - Retorna objeto do tipo Cliente ou null caso nao seja encontrado
    */
   public Cliente buscaCliente(String nome){
        for(Cliente cliente: this.listaCliente){
            if(cliente.getNome().equals(nome)){
                return cliente;
            }
        }
        return null;
    }
   /**metodo que recebe um cpf e retorna o cliente com esse cpf ou null caso nao exista o cliente com esse cpf
    * 
    * @param cpf String - CPF do cliente a ser buscado
    * @return Cliente - Retorna objeto do tipo Cliente ou null caso não seja 
    * encontrado
    */
    public Cliente buscaCpf(String cpf){
        for(Cliente cliente : this.listaCliente){
            if(cliente.getCpf().compareTo(cpf)==0)
            {
                return cliente;
            }
        }
        return null;
    }
    /**metodo que carrega os dados(clientes) do arquivo no array de clientes
     * 
     * 
     */
    public void lerArquivo(){
        
        FileReader fileR;
        BufferedReader buff;
        try {        
            fileR = new FileReader("Clientes.txt");
            buff = new BufferedReader(fileR);
            while(buff.ready()){
                Cliente cliente = new Cliente();
                cliente.setNome(buff.readLine());
                cliente.setCpf(buff.readLine());
                cliente.setEndereco(buff.readLine());
                this.listaCliente.add(cliente);
            }
            buff.close();
            fileR.close();
        } catch (FileNotFoundException ex) {
            Logger.getLogger(ClienteDAO.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(ClienteDAO.class.getName()).log(Level.SEVERE, null, ex);
        }            
    }
    /**metodo que escreve os clientes do array no arquivo txt
     * 
     */
    public void escreverArquivo(){
       
        try {
        
            FileWriter fw = new FileWriter("Clientes.txt",false);
            PrintWriter saida = new PrintWriter(fw,true);
            for(Cliente cliente : this.listaCliente){
                saida.println(cliente.getNome());
                saida.println(cliente.getCpf());
                saida.println(cliente.getEndereco());
            }    
            
            saida.close();
            fw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
   /**Método que retorna lista de Clientes
    * 
    * @return ArrayList- ArrayList do tipo Cliente, o qual contem varios clientes 
    */
   public ArrayList<Cliente> getListaClientes(){
       return listaCliente;
   }
}